package com.beans.aboutIO;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

/**
 * Created by admin on 2017/5/18.
 */
public class AboutBuffer {

    private static Logger logger = LogManager.getLogger("sunLog");

    @Test
    public void testByteBuffer() throws UnsupportedEncodingException {
        String str = "HelloByteBuffer";  // TODO 长度 15
        // 初始化一个1024字节的 buffer
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        logger.info("----------初始化后----------");
        logger.info("buffer 指针的位置:"+buffer.position());
        logger.info("buffer的限置:"+buffer.limit());
        logger.info("buffer的容量:"+buffer.capacity());

        // 2. 存放数据 以备测试
        logger.info("----------存放数据----------");
        buffer.put(str.getBytes("utf-8"));
        logger.info("buffer 指针的位置:"+buffer.position());
        logger.info("buffer的限置:"+buffer.limit());
        logger.info("buffer的容量:"+buffer.capacity());


        //3. 切换读取数据模式
        logger.info("----------模式切换----------");
        buffer.flip();
        logger.info("buffer 指针的位置:"+buffer.position());
        logger.info("buffer的限置:"+buffer.limit());
        logger.info("buffer的容量:"+buffer.capacity());

        //4. 利用 get() 读取缓冲区中的数据
        byte[] dst = new byte[buffer.limit()];
        buffer.get(dst);
        logger.info("----------读取数据----------");
        logger.info(new String(dst, 0, dst.length));
        logger.info("buffer 指针的位置:"+buffer.position());
        logger.info("buffer的限置:"+buffer.limit());
        logger.info("buffer的容量:"+buffer.capacity());

        /**
         * TODO 由于限制位在 15 位置:所以当尝试 往buffer 填充数据的时候,会用position 和 limit 比较
         * TODO position >= limit 会触发 java.nio.BufferOverflowException
         * TODO buffer.put(str.getBytes("utf-8"));
         *
         */

        // 5.尝试重复读取
        buffer.rewind();
        logger.info("----------重复读取----------");
        //byte[] dst1 = new byte[buffer.limit()];
        //buffer.get(dst1);
        byte b = buffer.get();
        logger.info(b);
        logger.info(new String(dst, 0, dst.length));
        logger.info("buffer 指针的位置:"+buffer.position());
        logger.info("buffer的限置:"+buffer.limit());
        logger.info("buffer的容量:"+buffer.capacity());
    }

    @Test
    public void test2(){
        String str = "abcde";
        ByteBuffer buf = ByteBuffer.allocate(1024);
        buf.put(str.getBytes());
        buf.flip();
        byte[] dst = new byte[buf.limit()];
        buf.get(dst, 0, 2);
        System.out.println(new String(dst, 0, 2));
        System.out.println(buf.position());
        //mark() : 标记
        buf.mark();
        buf.get(dst, 2, 2);
        System.out.println(new String(dst, 2, 2));
        System.out.println(buf.position());
        //reset() : 恢复到 mark 的位置
        buf.reset();
        System.out.println(buf.position());
        //判断缓冲区中是否还有剩余数据
        if(buf.hasRemaining()){
            //获取缓冲区中可以操作的数量
            System.out.println("buffer中剩余可操作的数量-----"+buf.remaining());
        }
    }
}
